#pragma once

#include <iostream>
#include <pthread.h>

class Mutex
{
public:
    Mutex(pthread_mutex_t *lock_p = nullptr) : lock_p_(lock_p)
    {
    }
    // 加锁
    void lock()
    {
        if (lock_p_)
            pthread_mutex_lock(lock_p_);
    }
    // 解锁
    void unlock()
    {
        if (lock_p_)
            pthread_mutex_unlock(lock_p_);
    }
    ~Mutex()
    {
    }

private:
    // 这个lock_p_需要外部传进来
    pthread_mutex_t *lock_p_;
};

class LockGuard
{
public:
    LockGuard(pthread_mutex_t *mutex) : mutex_(mutex)
    {
        mutex_.lock(); // 在构造函数中进行加锁
    }
    ~LockGuard()
    {
        mutex_.unlock(); // 在析构函数中进行解锁
    }
private:
    // 将自定义的mutex封装进来
    Mutex mutex_;
};

// 搞两层封装的意义 就是对互斥量进一步封装 在构造/析构中自动调用加/解锁
// 不需要在外部调用函数 外部只要定义了LockGuard就自动实现加解锁